package com.sigmatrix.h5.dao.impl;

import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;
import org.springframework.util.CollectionUtils;

import com.sigmatrix.h5.dao.MultistageLevelQrCodeDao;
import com.sigmatrix.h5.entity.MultistageLevelQRCode;
import com.sigmatrix.h5.exception.DaoException;
import com.sigmatrix.sc.mongo.common.dao.MongoDaoImpl;
/**
 * 
 *@ClassName: MultistageLevelQrCodeDaoImpl
 *@Description: 多级码表
 *@author MH
 *@date 2017年9月22日 上午9:50:00
 */
@Repository(value="multistageLevelQRCodeDao")
public class MultistageLevelQrCodeDaoImpl extends MongoDaoImpl<MultistageLevelQRCode> implements MultistageLevelQrCodeDao{

	/**注入mongoTemplate*/
	@Autowired
	private transient MongoTemplate mongoTemplate;
	
	/**(non-Javadoc)
	 *@Title: findMultistageLevelQRCodeByQRCode
	 *@Description: 
	 *@see com.sigmatrix.sc.handheld.inter.dao.MultistageLevelQRCodeDao#findMultistageLevelQRCodeByQRCode(java.lang.String, java.lang.String)
	 *@author youjun
	 *@date 2017年7月3日 下午5:26:09
	 */
	@Override
	public MultistageLevelQRCode findMultistageLevelQRCodeByQRCode(final String enterpriseCode, final String qRCode) throws DaoException {

		if(StringUtils.isBlank(enterpriseCode)){
			throw new DaoException("企业code不能为空");
		}
		if(StringUtils.isBlank(qRCode)){
			throw new DaoException("码不能为空");
		}
		final Query query = new Query();
		query.addCriteria(Criteria.where("enterpriseCode").is(enterpriseCode));
	    query.addCriteria(Criteria.where("packContent").is(qRCode));
		return mongoTemplate.findOne(query, MultistageLevelQRCode.class);
	}
	
	@Override
	public MultistageLevelQRCode findMultistageLevelQRCodeByFriendlyCode(final String enterpriseCode, final String friendlyCode) throws DaoException {
		if(StringUtils.isBlank(enterpriseCode)){
			throw new DaoException("企业code不能为空");
		}
		if(StringUtils.isBlank(friendlyCode)){
			throw new DaoException("友好码不能为空");
		}
		final Query query = new Query();
		query.addCriteria(Criteria.where("enterpriseCode").is(enterpriseCode));
	    query.addCriteria(Criteria.where("friendlyCode").is(friendlyCode));
		return mongoTemplate.findOne(query, MultistageLevelQRCode.class);
	}

	/**
	 * (non-Javadoc)
	 *@Title: findMultistageLevelQRCodeByQRCodeAndLevel
	 *@Description: 
	 *@see com.sigmatrix.sc.handheld.inter.dao.MultistageLevelQRCodeDao#findMultistageLevelQRCodeByQRCodeAndLevel(java.lang.String, java.lang.String, java.lang.Integer)
	 *@author youjun
	 *@date 2017年8月6日 下午4:00:39
	 */
	@Override
	public MultistageLevelQRCode findMultistageLevelQRCodeByQRCodeAndLevel(final String enterpriseCode, final String qRCode, 
			final Integer qRCodeLevel) throws DaoException {
		
		if(qRCodeLevel==null){
			return findMultistageLevelQRCodeByQRCode(enterpriseCode, qRCode);
		}
		final Query query = new Query();
		query.addCriteria(Criteria.where("enterpriseCode").is(enterpriseCode));
	    query.addCriteria(Criteria.where("packContent").is(qRCode));
	    query.addCriteria(Criteria.where("packLevel").is(qRCodeLevel));
		return mongoTemplate.findOne(query, MultistageLevelQRCode.class);
	}
	
	
	@Override
	public MultistageLevelQRCode findMultistageLevelQRCodeByFriendlyCodeAndLevel(final String enterpriseCode, final String friendlyCode, 
			final Integer qRCodeLevel) throws DaoException {
		
		if(qRCodeLevel==null){
			return findMultistageLevelQRCodeByQRCode(enterpriseCode, friendlyCode);
		}
		final Query query = new Query();
		query.addCriteria(Criteria.where("enterpriseCode").is(enterpriseCode));
	    query.addCriteria(Criteria.where("friendlyCode").is(friendlyCode));
	    query.addCriteria(Criteria.where("packLevel").is(qRCodeLevel));
		return mongoTemplate.findOne(query, MultistageLevelQRCode.class);
	}

	/**(non-Javadoc)
	 *@Title: findMultistageLevelQRCodeBySeqNumAndLevel
	 *@Description: 
	 *@see com.sigmatrix.sc.handheld.inter.dao.MultistageLevelQRCodeDao#findMultistageLevelQRCodeBySeqNumAndLevel(java.lang.String, java.lang.String, java.lang.Integer)
	 *@author youjun
	 *@date 2017年8月10日 下午8:12:12
	 */
	@Override
	public MultistageLevelQRCode findMultistageLevelQRCodeBySeqNumAndLevel(String enterpriseCode, String seqNum,
			Integer qRCodeLevel) throws DaoException {

		if(qRCodeLevel==null){
			return findMultistageLevelQRCodeBySeqNum(enterpriseCode, seqNum);
		}
		final Query query = new Query();
		query.addCriteria(Criteria.where("enterpriseCode").is(enterpriseCode));
	    query.addCriteria(Criteria.where("seqNum").is(seqNum));
	    query.addCriteria(Criteria.where("packLevel").is(qRCodeLevel));
		return mongoTemplate.findOne(query, MultistageLevelQRCode.class);
	}

	/**(non-Javadoc)
	 *@Title: findMultistageLevelQRCodeBySeqNum
	 *@Description: 
	 *@see com.sigmatrix.sc.handheld.inter.dao.MultistageLevelQRCodeDao#findMultistageLevelQRCodeBySeqNum(java.lang.String, java.lang.String)
	 *@author youjun
	 *@date 2017年8月10日 下午8:12:12
	 */
	@Override
	public MultistageLevelQRCode findMultistageLevelQRCodeBySeqNum(final String enterpriseCode, final String seqNum) throws DaoException {
		
		if(StringUtils.isBlank(enterpriseCode)
				||StringUtils.isBlank(seqNum)) {
			throw new DaoException("参数有误");
		}
		final Query query = new Query();
		query.addCriteria(Criteria.where("enterpriseCode").is(enterpriseCode));
	    query.addCriteria(Criteria.where("seqNum").is(seqNum));
		return mongoTemplate.findOne(query, MultistageLevelQRCode.class);
	}

	/**(non-Javadoc)
	 *@Title: updateOne
	 *@Description: 
	 *@see com.sigmatrix.sc.handheld.inter.dao.MultistageLevelQRCodeDao#updateOne(com.sigmatrix.sc.handheld.inter.entity.MultistageLevelQRCode)
	 *@author youjun
	 *@date 2017年8月14日 上午10:38:19
	 */
	@Override
	public void updateOne(final MultistageLevelQRCode item) throws DaoException {

		if(item==null
				||StringUtils.isBlank(item.getPackContent())) {
			throw new DaoException("更新多级码参数有误");
		}
		final Query query=new Query(Criteria.where("packContent").is(item.getPackContent()));
        final Update update = new Update();
        if(item.getStatus()!=null){
        	update.set("status", item.getStatus());
        }
        if(item.getChildNum()!=null) {
        	update.set("childNum", item.getChildNum());
        }
        if(item.getChilds()!=null) {
        	update.set("childs", item.getChilds());
        }
        if(item.getParentCode()!=null) {
        	update.set("parentCode", item.getParentCode());
        }
        //更新查询返回结果集的第一条
        mongoTemplate.updateFirst(query, update, MultistageLevelQRCode.class);
        //更新查询返回结果集的所有
        // mongoTemplate.updateMulti(query,update,UserEntity.class);
	}
	
	
	@Override
	public void batchUpdateByPackContentList(final MultistageLevelQRCode item, final List<String> packContentList) throws DaoException {

		if(item==null
				||StringUtils.isBlank(item.getEnterpriseCode())
				||CollectionUtils.isEmpty(packContentList)) {
			throw new DaoException("批量更新一组多级码的参数错误");
		}
		final Query query=new Query(Criteria.where("packContent").in(packContentList));
		query.addCriteria(Criteria.where("enterpriseCode").is(item.getEnterpriseCode()));
        final Update update = new Update();
        if(item.getStatus()!=null){
        	update.set("status", item.getStatus());
        }
        if(item.getChildNum()!=null) {
        	update.set("childNum", item.getChildNum());
        }
        if(item.getChilds()!=null) {
        	update.set("childs", item.getChilds());
        }
        if(item.getParentCode()!=null) {
        	update.set("parentCode", item.getParentCode());
        }
        //更新查询返回结果集的所有
        mongoTemplate.updateMulti(query, update, MultistageLevelQRCode.class);
	}

	/**
	 *@Title: batchSplitOrFillParentCode
	 *@Description: 批量拆除或着填充上级码关系
	 *@return void
	 *@author youjun
	 *@date 2017年8月19日 上午11:27:57
	 *@param enterpriseCode 企业code
	 *@param packContentList 批量操作的码
	 *@param parentCode
	 *@throws DaoException
	 */
	@Override
	public void batchSplitOrFillParentCode(final String enterpriseCode, final List<String> packContentList, final String parentCode) throws DaoException {
		if(StringUtils.isBlank(enterpriseCode)
				||CollectionUtils.isEmpty(packContentList)) {
			throw new DaoException("批量拆除一组多级码的上级码关系参数错误");
		}
		final Query query=new Query(Criteria.where("packContent").in(packContentList));
		query.addCriteria(Criteria.where("enterpriseCode").is(enterpriseCode));
        final Update update = new Update();
        update.set("parentCode", parentCode); // 将上级码更为""
        //更新查询返回结果集的第一条
        mongoTemplate.updateMulti(query, update, MultistageLevelQRCode.class);
	}

	/**(non-Javadoc)
	 *@Title: findMultistageLevelQRCodeByCondition
	 *@Description: 
	 *@see com.sigmatrix.sc.handheld.inter.dao.MultistageLevelQRCodeDao#findMultistageLevelQRCodeByCondition(com.sigmatrix.sc.handheld.inter.entity.MultistageLevelQRCode)
	 *@author youjun
	 *@date 2017年8月21日 下午1:37:27
	 */
	@Override
	public List<MultistageLevelQRCode> findMultistageLevelQRCodeByCondition(
			final MultistageLevelQRCode multistageLevelQRCode) throws DaoException {

		if(multistageLevelQRCode==null) {
			throw new DaoException("参数有误");
		}
		final Query query = new Query();
		if(StringUtils.isNotBlank(multistageLevelQRCode.getEnterpriseCode())) {
			query.addCriteria(Criteria.where("enterpriseCode").is(multistageLevelQRCode.getEnterpriseCode()));
		}
		if(StringUtils.isNotBlank(multistageLevelQRCode.getParentCode())) {
			query.addCriteria(Criteria.where("parentCode").is(multistageLevelQRCode.getParentCode()));
		}
		if(multistageLevelQRCode.getChildNum()!=null) {
			query.addCriteria(Criteria.where("childNum").is(multistageLevelQRCode.getChildNum()));
		}
		return mongoTemplate.find(query, MultistageLevelQRCode.class);
	}
	
}
